package com.qf.usefull.dict.service.impl;

import com.qf.usefull.dict.entity.Word;
import com.qf.usefull.dict.service.MyDictionary;

/**
 * 底层使用 Hash表结构来实现
 */
public class MyDictImpl02 extends AbstractMyDictImpl implements MyDictionary {


    public MyDictImpl02() {
    }

    public MyDictImpl02(int capacity) {
        super(capacity);
    }

    @Override
    public void addWord(String english, String chinese) {

        Word word = new Word(english, chinese);
        // 单词的插入位置如何处理呢？
        int index = calculateIndex(english);

        Word[] arr = getArr();

        // 判断当前位置是否已经存在单词了
        if (arr[index] != null) {
            // 如何解决计算出来的下标中已经存放了单词呢
            Word tmp = arr[index];
            while (tmp.getNext() != null) {
                tmp = tmp.getNext();
            }
            // 把单词加入到链表的最后
            tmp.setNext(word);
        }

        arr[index] = word;
        int count = getCount();
        setCount(count++);

    }

    /**
     * 计算添加到字典的英文单词对应的数组中的下标
     *
     * @param english
     * @return
     */
    private int calculateIndex(String english) {
        int hash = english.hashCode();
        if (hash < 0) {
            hash = hash * -1;
        }
        return hash % getArr().length;
    }

    @Override
    public String findWord(String english) {
        // 计算英文单词对应的数组下标
        int index = calculateIndex(english);
        Word[] arr = getArr();
        Word word = arr[index];
        if (word == null) { // 单词没有收入到字典中，直接返回null
            return null;
        }

        if (word.getEnglish().equals(english)) {
            return arr[index].getChinese();
        } else {
            Word tmp = arr[index];
            while (tmp.getNext() != null) {
                if (tmp.getEnglish().equals(english)) {
                    return tmp.getChinese();
                }
                tmp = tmp.getNext();
            }
        }

        return null;
    }
}
